package ve.com.wayoyo.wuml_case.DibujoDiagramas;

import ve.com.wayoyo.wuml_case.Alert;
import ve.com.wayoyo.wuml_case.Exceptions.TituloVacioExecption;
import android.R;
import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Point;
import android.nfc.tech.IsoDep;

public class DiagramaUml extends Diagrama {

	private Componente _selectedItemFather;
	
	public DiagramaUml() {
		super();
		Nombre = "";
		Tipo = "uml";

	}

	@Override
	public void moverItemSeleccionado(int distX, int distY) {
		if (_tutorialStage == 2) {
			_tutorialStage = 3;
		}
		if (SelectedItem != null) {
			SelectedItem.mover(distX, distY);
			SelectedItem.actualizarPuntoCentral();
		}
	}

	@Override
	public void Dibujar(Canvas c, int offSetX, int offSetY, float GlobalScale) {

		for (Componente Value : _components) {
			// if(Value.CalcularVisibilidad(offSetX,offSetY,GlobalScale)){
			Value.Dibujar(c, false, GlobalScale, offSetX, offSetY);
			// }
		}

		// Scroll Bars
		if (((VistaDiagrama) VistaDiagrama.getVista()).getMoveFlag() == true) {
			dibujarScrollBars(c, offSetX, offSetY, GlobalScale);
		}

		// Zoom Helper
		if (((VistaDiagrama) VistaDiagrama.getVista()).isZooming() == true) {
			dibujarZoomGuide(c, GlobalScale);
		}

		// Muestra la ventana de ayuda
		if (_showHelp) {
			dibujarAyuda(c);
		}

		// Muestra los tips en el fondo de la pantalla
		if (_showTutorial) {
			dibujarTutorial(c);
		}

	}

	@Override
	public int checkOnTouch(Point touchPoint, String type) {
		CompConector aux = null;
		int respuesta = VistaDiagrama.IDLE;
		if (type.equals("Select")) {
			for (Componente Value : _components) {
				if (Value.calcularTouch(touchPoint) == true) {
					respuesta = VistaDiagrama.ITEM_SELECTED;
					resetFocus();
					if (_SelectedConector != null) {
						_SelectedConector.setState(CompConector.IDLE_STATE);
						getComponenteById(_SelectedConector.get_fatherId()).set_currentState(Componente.IDLE);
						getComponenteById(_SelectedConector.get_childId()).set_currentState(Componente.IDLE);
						_SelectedConector = null;
					}
					if(_selectedItemFather != null){
						_selectedItemFather.removeFocus();
						_selectedItemFather = null;
					}
					SelectedItem = Value;
					SelectedItem.set_currentState(Componente.SELECTED);
					_SelectedConector = null;
					break;
				}else if( Value instanceof CompObjeto){
					Componente compAux = ((CompObjeto) Value).calcularTouchBarra(touchPoint);
					if(compAux != null){
						respuesta = VistaDiagrama.ITEM_SELECTED;
						resetFocus();
						if (_SelectedConector != null) {
							_SelectedConector.setState(CompConector.IDLE_STATE);
							getComponenteById(_SelectedConector.get_fatherId()).set_currentState(Componente.IDLE);
							getComponenteById(_SelectedConector.get_childId()).set_currentState(Componente.IDLE);
							_SelectedConector = null;
						}
						if(_selectedItemFather != null){
							_selectedItemFather.removeFocus();
							_selectedItemFather = null;
						}
						SelectedItem = compAux;
						_selectedItemFather = Value;
						_selectedItemFather.set_currentState(Componente.LINKED);
						SelectedItem.set_currentState(Componente.SELECTED);
						break;
					}
					if(aux == null){
						aux = Value.calcularTouchConectores(touchPoint);
					}
				}else {
					if (aux == null) {
						aux = Value.calcularTouchConectores(touchPoint);
					}
				}
			}
			if (aux != null) {
				_SelectedConector = aux;
				respuesta = VistaDiagrama.CONNECTOR_SELECTED;
				resetFocus();
				_SelectedConector.setState(CompConector.SELECTED_STATE);
				getComponenteById(_SelectedConector.get_fatherId())
						.set_currentState(Componente.LINKED);
				getComponenteById(_SelectedConector.get_childId())
						.set_currentState(Componente.LINKED);
			}
		}
		if (type.equals("Connect")) {
			for (Componente Value : _components) {
				if (Value.calcularTouch(touchPoint) == true && (Value.isConnectable())) {
					if((Value.ID != SelectedItem.ID) || Value.isAllowRecursivity()){
						respuesta = VistaDiagrama.ITEM_SELECTED;
						CompLineConector nuevo;
						nuevo = new CompLineConector(SelectedItem.ID, Value.ID);
						Value.actualizarAchorsPoints();
						Value.actualizarPuntoCentral();
						SelectedItem.actualizarAchorsPoints();
						SelectedItem.actualizarPuntoCentral();
						nuevo.CalcularConexiones(SelectedItem, Value);
						SelectedItem._conectorsBegining.add(nuevo);
						Value._conectorsEnd.add(nuevo);
						SelectedItem.set_currentState(Componente.SELECTED);
						if (_tutorialStage == 3) {
							_showTutorial = false;
							_tutorialStage = 4;
						}
	
						break;
					}else{
						Alert.show("Este Componente no admite recursividad", (Activity) VistaDiagrama.getVista().getContext(), Alert.ERROR);
					}
				}else if(Value instanceof CompObjeto){
					Componente compAux = ((CompObjeto) Value).calcularTouchBarra(touchPoint);
					if(compAux != null){
						if((compAux.ID != SelectedItem.ID) || Value.isAllowRecursivity()){
							respuesta = VistaDiagrama.ITEM_SELECTED;
							CompLineConector nuevo;
							nuevo = new CompLineConector(SelectedItem.ID, compAux.ID);
							compAux.actualizarAchorsPoints();
							compAux.actualizarPuntoCentral();
							SelectedItem.actualizarAchorsPoints();
							SelectedItem.actualizarPuntoCentral();
							nuevo.CalcularConexiones(SelectedItem, compAux);
							SelectedItem._conectorsBegining.add(nuevo);
							compAux._conectorsEnd.add(nuevo);
							SelectedItem.set_currentState(Componente.SELECTED);
							if (_tutorialStage == 3) {
								_showTutorial = false;
								_tutorialStage = 4;
							}
							
						}
					}
				}
			}
		}
		return respuesta;
	}

	@Override
	public void resetFocus() {
		for (Componente Value : _components) {
			Value.removeFocus();
		}
		SelectedItem = null;
	}

	@Override
	public boolean validarNombre(String nuevo) throws TituloVacioExecption {
		boolean respuesta = true;
		if (nuevo.length() < 1) {
			throw new TituloVacioExecption();
			
		}
		return respuesta;
	}

	public void rotarComponente() {
		if (SelectedItem instanceof CompBarra) {
			((CompBarra) SelectedItem).Rotar();
		}
		VistaDiagrama.getVista().invalidate();
	}

	public void aumentarBarra() {
		if (SelectedItem instanceof CompBarra) {
			((CompBarra) SelectedItem).aumentar();
		}
		VistaDiagrama.getVista().invalidate();
	}

	public void reducirBarra() {
		if (SelectedItem instanceof CompBarra) {
			((CompBarra) SelectedItem).reducir();
		}
		VistaDiagrama.getVista().invalidate();
	}
	
	public void aumentarBaseLine(){
		if (SelectedItem instanceof CompObjeto) {
			((CompObjeto) SelectedItem).aumentarBaseLine();
		}
		VistaDiagrama.getVista().invalidate();
		
	}
	
	public void reducirBaseLine(){
		if (SelectedItem instanceof CompObjeto) {
			((CompObjeto) SelectedItem).reducirBaseLine();
		}
		VistaDiagrama.getVista().invalidate();
	}
	
	public void agregarLifeTime(){
		if(SelectedItem instanceof CompObjeto){
				CompLifeBar nuevo = (CompLifeBar) FactoryComponente.getComponente("LifeBar");
				lastIdGiven++;
				nuevo.setID(lastIdGiven);
				((CompObjeto)SelectedItem).agregarLifeTime(nuevo);
				VistaDiagrama.getVista().invalidate();
		}
	}
	
	public void aumentarLifeBar(){
		if (SelectedItem instanceof CompLifeBar) {
			((CompLifeBar) SelectedItem).aumentar();
		}
		VistaDiagrama.getVista().invalidate();
		
	}
	
	public void reducirLifeBar(){
		if (SelectedItem instanceof CompLifeBar) {
			((CompLifeBar) SelectedItem).reducir();
		}
		VistaDiagrama.getVista().invalidate();
	}
	
	@Override
	public Componente getComponenteById(int id) {
		for (Componente value : _components) {
			if(value instanceof CompObjeto){
				Componente aux;
				if (value.getID() == id){
					return value;
				}else{
					aux = ((CompObjeto) value).checkChildsID(id);
					if(aux != null){
						return aux;
					}
				}
					
			}else{
				if (value.getID() == id)
					return value;
			}
		}
		return null;
	}
}